/*********************************** 应用程序启动脚本 ************************************/
// 所需依赖项（核心模块）
const http = require('http')
const fs = require('fs')
const template = require('art-template')
const url = require('url')

let server = http.createServer()

var commitsData = [
  { name: 'Jack', message: '今天天气不错！', date: '2021-04-07' },
  { name: 'Rose', message: '今天天气确实不错！', date: '2021-04-07' },
  { name: 'JackMa', message: '今年又赚翻了！', date: '2021-04-06' },
  { name: 'Jastin', message: '你们好啊！', date: '2021-04-05' },
  { name: '张三', message: '厉害了，我滴哥 ！！', date: '2021-04-02' },
]

// 请求事件管理
server.on('request', function (req, res) {
  // url.parse()方法将路径解析为一个方便操作的对象；第二个参数为true表示直接将查询字符串转为一个对象（通过query属性来访问）
  let parseObj = url.parse(req.url, true)
  // console.log(parseObj);
  let pathName = parseObj.pathname // 单独获取不包含查询字符串的路径部分（该路径不包含 ？ 之后的内容）

  let reqUrl = req.url // 请求路径
  if (reqUrl === '/') {
    fs.readFile('./views/index.html', function (err, data) {
      if (err) {
        return res.end('404 Not found files!')
      }
      let htmlStr = template.render(data.toString(), {
        commitsData
      })
      // res.end(data)
      res.end(htmlStr)
    })
  } else if (reqUrl === '/post') {
    fs.readFile('./views/post.html', function (err, data) {
      if (err) {
        return res.end('404 Not found files!')
      }
      res.end(data)
    })
  } else if (reqUrl.indexOf('/public/') === 0) {
    // 统一处理：
    // 如果请求的路径以`/public/`开头的，则我认为你要获取public中的某个资源，所以我们就直接可以把请求路径当做文件路径来直接进行读取。
    // /public/css/main.css
    fs.readFile('.' + reqUrl, function (err, data) {
      if (err) {
        return res.end('404 Not found files!')
      }
      res.end(data)
    })
  } else if (pathName === '/pinglun') {
    // console.log('收到表单请求了', parseObj.query);
    // res.end(JSON.stringify(parseObj.query)) // 这里要注意： 一次请求只对应一次响应，响应结束
    /* 所以接下来要做的就是：
      1. 获取表单提交的数据 parseObj.query
      2.生成日期并且存储到数据对象列表中
      3.让用户重定向跳转到首页 /
    */
    let commit = parseObj.query
    commit.date = new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(2, '0') + '-' + new Date().getDate().toString().padStart(2, '0')
    commitsData.unshift(commit)
    /**
     * - 如何通过服务器让客户端重定向？
        1. 状态码设置为302临时重定向
          statusCode
        2. 在响应头中通过Location 告诉客户端往哪里重定向
          setHeader
        如果客户端发现收到服务器的响应的状态码是302就会自动去响应头中国找Location，然后对改地址发出新的请求，所以你会看到客户端自动跳转了。 
     */
    res.statusCode = 302
    res.setHeader('Location', '/')
    res.end()
  } else {
    // 其他的都处理成404 
    fs.readFile('./views/404.html', function (err, data) {
      if (err) {
        return res.end('404 Not found files!')
      }
      res.end(data)
    })
  }
})

server.listen('8989', function () {
  console.log('服务启动成功，可通过 http://127.0.0.1:8989 访问！！！');
})



